package net
{
	import data.MyBorderContainer;
	
	import equipments.PB;
	import equipments.PU;
	
	import flash.external.ExternalInterface;
	
	import mx.collections.ArrayList;
	import mx.messaging.Consumer;
	import mx.messaging.events.MessageEvent;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.remoting.RemoteObject;
	import mx.skins.spark.PanelBorderSkin;
	
	import net.data.ModelingItem;

	public class DoOpenWithAllLoad
	{
		
		/*
			 uid로 curItem을 찾는 프로세스는.. eq를 추가할때만 필요하다.
			대부분의 경우 curItem은 현재의 curItem과 같거나..방금 전 추가한 아이템과 같거나.. 아니면 현재의 curItem의 상위로 한단계식 찾아가며 구한다.
			이때 방금전에 추가한 아이템을 저장하기 위한 변수이다.
		*/
		private var agoItem:MyBorderContainer;
		private var agoBrItem:MyBorderContainer;
		
		//프로젝트 아이디
		private var projectID:String;
		
		public function DoOpenWithAllLoad(_projectID:String):void
		{
			ExternalInterface.call("console.log","DoOpenWithAllLoad");
			projectID = _projectID;
			
			
			//java로 데이터를 보내달라는 메서드를 보낸다. 
			var remoteRo:RemoteObject=new RemoteObject("remoteRO");
			remoteRo.showBusyCursor=true;
			remoteRo.addEventListener(ResultEvent.RESULT,ro_hdl);
			remoteRo.addEventListener(FaultEvent.FAULT,roFalult_hdl);
			remoteRo.sendLoadData(projectID);
//			remoteRo.sendLoadData("64"); 
		}
		
		protected function roFalult_hdl(event:FaultEvent):void
		{
			
//			ExternalInterface.call("alert",event.message["faultString"]);
			ExternalInterface.call("console.log",event.message);
		}
		
		private function ro_hdl(e:ResultEvent):void
		{
			//넘어오는 모델링 데이터들은 뎁스와 타입과 관계없이.. list 형태로 순서대로 넘어온다.
			var dataArr:Vector.<ModelingItem> = Vector.<ModelingItem>(e.result);
			ExternalInterface.call("console.log","dataArr:"+dataArr);
			ExternalInterface.call("console.log",dataArr);
			modelingDataSettingInView(dataArr)
		}	
		
		/*
		branch화면 셋팅 - 제일 첫화면의 화면 구성 해주기..
		Maros.home.item_bt_setting 메서드를 호출하여 MyBorderContainer를 리턴받아서.. 셋팅을 해준다.
		*/
		private function modelingDataSettingInView(_moArr:Vector.<ModelingItem>):void{
			trace("================= DoOpenWithAllLoad.modelingDataSettingInView("+_moArr+") =================");
			
			var bc:MyBorderContainer;
			
			for each(var item:ModelingItem in _moArr){
				
				trace(item.moType);
				ExternalInterface.call("console.log",item);
				
				if(item.moType == "br"){
					Maros.home.curItem = null;
					bc=Maros.home.item_bt_setting(item.moType,0,false,item.moName);
					bc.upLeveBc=null;
					bc.uid = item.moSelf;
					bc.x = Number(item.moPosx);
					bc.y = Number(item.moPosy);
					bc.categori = "branch";
					bc.iName = "br";
					bc.title = item.moName;
					
					
					bc.outBcUidArr = (item.moOut)?item.moOut.split("/"):null;
					
					agoBrItem=bc;
					
				}else{
					Maros.home.curItem = getCurItemForUid(item.moPre);
					trace("Maros.home.curItem:",Maros.home.curItem);
					if(item.moType=="pb"){
						trace("pb넣기");
						bc=Maros.home.item_bt_setting(item.moType);
					}else if(item.moType=="pu"){
						trace("pu넣기");
						var pb:PB=Maros.home.curItem as PB;
						trace("pb:",pb);
						bc = pb.addPU() as PU;
						PU(bc).puPercentage=Number(item.moPuValue);
						Maros.home.curItem = pb;
					}else{
						bc=Maros.home.item_bt_setting(item.moType,0,true,item.moName,item.moTagId,item.moSelf);
					}
					bc.upLeveBc = Maros.home.curItem;
					bc.uid = item.moSelf;
					bc.itemId = item.moSelf;
					bc.title = item.moName;
//					bc.categori=bc.iName = item.moType;
					
				}
				
				ExternalInterface.call("console.log",item.moType+","+item.moImg);
				
				//아이템의 이미지 셋팅
				if(item.moImg != "base"){
					bc.imgUrl="/ram/Admin/System_Img/Upload/"+item.moImg+".gif";
				}
				
				agoItem = bc;
//				trace("agoItem:",agoItem.title);
//				bc.item.@label = item.moName; // <- bc.item 은 bc에 할당된 xml노드를 가르킨다.
			}
			
			/*
				branch끼리 연결되는 라인 셋팅
				branch 끼리의 연결작업은 모든 branch가 로드된 후에 작업되어야 한다.
			*/
			//나가는 화살표 셋팅
			for each(var branch:MyBorderContainer in Maros.home.branchArr.toArray()){
				for each(var _uid:String in branch.outBcUidArr){
					var toOutBc:MyBorderContainer = getBranchForUid(_uid);
					if(toOutBc==null){
						continue;
					}
					Maros.home.bendLineDraw(branch, toOutBc);
				}
			}
			
			Maros.home.curItem=null;
		}
		
		/*
			uid로 curItem찾기.
			전체 모델링 아이템을 불러올때.. branch가 아닌 eq들의 경우에는 부모의 detailView안에..addElement를 해야하는데..
			해당 부모아이템을 uid로 찾는다.
			
			eq타입을 셋팅할때는 curItem을 해당 아이템으로 셋팅한후에 한다.
			curItem은 uid로 비교하되.. 아래 3가지 정도로 찾을수있다.
			
			curItem찾는 조건
			1. 현재 curItem과 같은지? 
			2. 아니라면 바로전에 불러온 아이템인지?
			3. 그것도 아니라면 한단계씩 상위 단계의 아이템을 찾는다.
		*/
		private function getCurItemForUid(_uid:String):MyBorderContainer{
			trace("================= DoOpenWithAllLoad.getCurItemForUid(_uid) =================");
			trace("_uid:",_uid);
			trace("agoItem:",agoItem.uid);
			trace("agoBrItem:",agoBrItem.uid);
			
			var curItem:MyBorderContainer = Maros.home.curItem;
			var tempItem:MyBorderContainer;
			if(curItem==null){
				return agoBrItem;
			}else if(curItem.uid == _uid){
				trace("curItem.uid==_uid");
				return curItem;
			}else if(agoItem.uid==_uid){
				trace("agoItem.uid==_uid");
				return agoItem;
			}else{
				//현재 curItem의 상위를 한단계씩 올라가며 찾는다.
				
				while(curItem.uid!=_uid){
					trace("curItem:",curItem.title);
					trace("curItem.upLevelBc:",curItem.upLeveBc);
					curItem=curItem.upLeveBc;
					trace("curItem:",curItem);
					if(curItem==null){
						return null;
					}
				}
				return curItem;
			}
		}
		
		
		/*
			uid로 branch를 구하는 메서드
			branch의 모델링 데이터를 셋팅할때.. branch끼리 연결된 라인을 나타내기 위해서는..
			java에서 넘어오는 uid를 가지고 branch를 찾아야 한다.
		*/
		private function getBranchForUid(_uid:String):MyBorderContainer{
			var branchArr:ArrayList = Maros.home.branchArr;
			for each(var item:MyBorderContainer in branchArr.toArray()){
				if(item.uid == _uid){
					return item;
				}
			}
			return null;
		}
	}
}